package com.jel.WiKikonwledge.Service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jel.WiKikonwledge.Dao.GetSon;
import com.jel.WiKikonwledge.Dao.GetSonlmpl;
import com.jel.WiKikonwledge.bean.cont;
import com.jel.WiKikonwledge.bean.graph;
import org.junit.Test;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author curbert:jiangenlai
 * @description
 * @date 2022-05-24 18:37:20
 * @PACKAGE_NAME:com.jel.WiKikonwledge.Service
 */
@Service
public class GetAlllmpl implements GetAll{
    GetSon fs =new GetSonlmpl();

    @Override
    public graph graph(List<Object> arr) {
        System.out.println(arr.toString());
        return null;
    }
    @Test
    public void contd(){
        String id = "entity/Q35120";
        GetSon fd = new GetSonlmpl();
        List<Object> arr = fd.tree(id,"P279");

        // 从此开始表示数据内容
        List<Object> evet = sog(arr);
        JSONArray edges = JSON.parseArray(evet.get(0).toString());
        JSONArray vertices = JSON.parseArray(evet.get(1).toString());
        graph elem = takar(edges,vertices,id);

    }
    public List<Object> sog(List<Object> arr){
        HashSet<Object> hash = new HashSet<>();
        HashSet<Object> hashset = new HashSet<>();
        for (Object ey: arr
        ) {
            JSONObject every = trans(ey);
            JSONArray edges = every.getJSONArray("edges");
            JSONArray vertices = every.getJSONArray("vertices");

            for (Object i: edges
            ) {
                hash.add(i);
            }
            for (Object j: vertices
            ) {
                hashset.add(j);
            }
        }
        List<Object> ert = new ArrayList<>();
        ert.add(hash);
        ert.add(hashset);
        return ert;
    }
    List<graph> ele = new ArrayList<>();
    public graph takar(JSONArray edges, JSONArray vertices, String id){
        graph graphs = new graph();
        //休息
//        String val = null;
        boolean flag = true;

        for (Object elem: edges
             ) {
            JSONObject edge = trans(elem);
            String to = edge.getString("_to");
            String from = edge.getString("_from");
//            val = from;
            if(to.equals(id)) {
                flag = false;
                for (Object each : vertices
                ) {
                    JSONObject vertice = trans(each);
                    String to_val = vertice.getString("_id");
                    if (to.equals(to_val)) {
                        graphs.get_label(vertice);
                        graphs.setId(to_val);
                        break;
                    }
                }
                graph elen = takar(edges,vertices, from);
                graphs.setChidren(elen.getChidren());
            }
        }
        ele.clear();

        if(flag){
            for (Object elem: edges
            ) {
                JSONObject edge = trans(elem);
                String to = edge.getString("_to");
                if(to.equals(id)) {
                    for (Object each : vertices
                    ) {
                        JSONObject vertice = trans(each);
                        String to_val = vertice.getString("_id");
                        if (to.equals(to_val)) {
                            graphs.get_label(vertice);
                            graphs.setId(to_val);
                            ele.add(graphs);
                            break;
                        }
                    }
                }
            }
            graphs.setChidren(ele);
            return graphs;
        }
        return graphs;
    }

    public JSONObject trans(Object elem){
        return JSON.parseObject(elem.toString());
    }
}
//    @Override
//    public JSONObject getP31elem(String tagName, int flown) {
//        JSONObject result = new JSONObject();
//        Queue<Object> queue = new LinkedList<>();
//        int count = 0;
//        int[] flags=new int[10000];
//        int o=0;
//        JSONObject res;
//        res = fs.getall(tagName);
//        result.put(String.valueOf(o),res);
//        flags[o]=++count;
//        for(Object e : res.getJSONArray("P31")){
//            queue.offer(e);
//            count++;
//        }
//        flags[++o]=count;
//        while(!queue.isEmpty()){
//            if(o>=flown){
//                break;
//            }
//            String tag = (String) queue.poll();
//            JSONObject aql = fs.getall(tag);
//            result.put(String.valueOf(o), aql);
//            for(Object e : aql.getJSONArray("P31")) {
//                queue.offer(e);
//                count++;
//            }
//
//            if(result.size()>=flags[o]){
//                flags[++o] = count;
//            }
//        }
//        return result;
//    }
//    @Override
//    public JSONObject getP279elem(String tagName, int flown) {
//        JSONObject result = new JSONObject();
//        Queue<Object> queue = new LinkedList<>();
//        int count = 0;
//        int[] flags=new int[10000];
//        int o=0;
//        JSONObject res;
//        res = fs.getall(tagName);
//        result.put(String.valueOf(o),res);
//        flags[o]=++count;
//        for(Object e : res.getJSONArray("P279")){
//            queue.offer(e);
//            count++;
//        }
//        flags[++o]=count;
//        while(!queue.isEmpty()){
//            if(o>=flown){
//                break;
//            }
//            String tag = (String) queue.poll();
//            JSONObject aql = fs.getall(tag);
//            result.put(String.valueOf(o), aql);
//            for(Object e : aql.getJSONArray("P279")) {
//                queue.offer(e);
//                count++;
//            }
//
//            if(result.size()>=flags[o]){
//                flags[++o] = count;
//            }
//        }
//        return result;
//    }
//
//    @Override
//    public JSONArray ToTree(ArrayList<cont> arr, String name, String id) {
//        JSONArray result = new JSONArray();
//        JSONObject value = new JSONObject();
//        for (cont elem: arr
//             ) {
//            //查找出一级的标签的对应的位置及[{name:"entity"}]
//            String from = elem.getFrom();
//            System.out.println(from);
//            System.out.println(name);
//            System.out.println("\n");
//            if(from.equals(name)){
//                String names = "name";
//                String child = "child";
//                String ids = "id";
//                value.put(names,elem.getLabel());
//                value.put(ids,name);
//                System.out.println(value);
//                String To = elem.getTo();
//                JSONArray son1 = new JSONArray();
//                for (cont son: arr
//                     ) {
//                    //查找出第二级满足所有指向entity节点的数据verticery数据节点，然通过对数据节点的处理添加进第二层的name,child[{name:"child1",child:""},{name...
//                    if(To.equals(son.getFrom())){
//                        JSONObject end1 = new JSONObject();
//                        end1.put(names,son.getLabel());
//                        end1.put(ids,son.get_key());
//                        JSONArray son2  = new JSONArray();
//                        String To2 = son.getTo();
//                        for (cont sonn2: arr
//                             ) {//
//                            //查找第三级中满足from指向第二级别中的数据中的节点的数据，将节点的数据传入sonn2的json中并传入son1的尾巴里面，而且sonn2的节点值仅仅只有一个name
//                            if(To2.equals(sonn2.getFrom())){
//                                JSONObject end2 = new JSONObject();
//                                end2.put(names,sonn2.getLabel());
//                                end2.put(ids,sonn2.get_key());
//                                son2.add(end2);
//                            }
//                        }
//                        end1.put(child,son2);
//                        son1.add(end1);
//                    }
//                }
//                value.put(child, son1);
//            }
//        }
//        result.add(value);
//        System.out.println(result);
//        return result;
//    }
//
//    @Override
//    public  JSONArray listToTree(JSONArray arr, String id, String pid, String child) {
//        JSONArray r = new JSONArray();
//        JSONObject hash = new JSONObject();
//        //将数组转为Object的形式，key为数组中的id
//        for (int i = 0; i < arr.size(); i++) {
//            JSONObject json = (JSONObject) arr.get(i);
//            hash.put(json.getString(id), json);
//        }
//        //遍历结果集
//        for (int j = 0; j < arr.size(); j++) {
//            //单条记录
//            JSONObject aVal = (JSONObject) arr.get(j);
//            //在hash中取出key为单条记录中pid的值
//            String pidStr = "";
//            Object pidObj = aVal.get(pid);
//            if (aVal.get(pid) != null) {
//                pidStr = aVal.get(pid).toString();
//            }
//            JSONObject hashVP = (JSONObject) hash.get(pidStr);
//            //如果记录的pid存在，则说明它有父节点，将她添加到孩子节点的集合中
//            if (hashVP != null) {
//                //检查是否有child属性
//                if (hashVP.get(child) != null) {
//                    JSONArray ch = (JSONArray) hashVP.get(child);
//                    ch.add(aVal);
//                    hashVP.put(child, ch);
//                } else {
//                    JSONArray ch = new JSONArray();
//                    ch.add(aVal);
//                    hashVP.put(child, ch);
//                }
//            } else {
//                r.add(aVal);
//            }
//        }
//        return r;
//    }
